import moment from "moment";
import { parse, stringify } from "qs";
import { TENANT_STORAGE_KEY } from "./consts";

export function fixedZero(val) {
  return val * 1 < 10 ? `0${val}` : val;
}

// 获取月初/月末时间
export function getMonth(type, date) {
  if (type === "start") {
    return moment(date).startOf("month");
  }
  return moment(date).endOf("month");
}

export function getTimeDistance(type, num = 1) {
  const now = new Date();
  const oneDay = 1000 * 60 * 60 * 24;

  if (type === "date") {
    now.setHours(0);
    now.setMinutes(0);
    now.setSeconds(0);
    return [moment(now).subtract(num, "days"), moment(now).subtract(1, "days")];
  }

  if (type === "week") {
    const beforeWeek = moment().add(-7, "days");

    return [moment(beforeWeek), moment()];
  }
  if (type === "month") {
    // 近 * 月
    const beforeDate = moment(now)
      .startOf("month")
      .subtract(num, "months");
    const endDate = moment(now)
      .endOf("month")
      .subtract(1, "months");
    return [moment(beforeDate), moment(endDate)];
  }

  if (type === "year") {
    const year = now.getFullYear();
    const month = now.getMonth();
    const Date = now.getDate();
    return [
      moment(
        `${year - 1}-${month +
          1}-${Date} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`
      ),
      moment()
    ];
  }
  return [moment(now), moment(now.getTime() + (oneDay - 1000))];
}

export function getPlainNode(nodeList, parentPath = "") {
  const arr = [];
  nodeList.forEach(node => {
    const item = node;
    item.path = `${parentPath}/${item.path || ""}`.replace(/\/+/g, "/");
    item.exact = true;
    if (item.children && !item.component) {
      arr.push(...getPlainNode(item.children, item.path));
    } else {
      if (item.children && item.component) {
        item.exact = false;
      }
      arr.push(item);
    }
  });
  return arr;
}

function accMul(arg1, arg2) {
  let m = 0;
  const s1 = arg1.toString();
  const s2 = arg2.toString();
  m += s1.split(".").length > 1 ? s1.split(".")[1].length : 0;
  m += s2.split(".").length > 1 ? s2.split(".")[1].length : 0;
  return (Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) / 10 ** m;
}

export function digitUppercase(n) {
  const fraction = ["角", "分"];
  const digit = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
  const unit = [
    ["元", "万", "亿"],
    ["", "拾", "佰", "仟", "万"]
  ];
  let num = Math.abs(n);
  let s = "";
  fraction.forEach((item, index) => {
    s += (digit[Math.floor(accMul(num, 10 * 10 ** index)) % 10] + item).replace(
      /零./,
      ""
    );
  });
  s = s || "整";
  num = Math.floor(num);
  for (let i = 0; i < unit[0].length && num > 0; i += 1) {
    let p = "";
    for (let j = 0; j < unit[1].length && num > 0; j += 1) {
      p = digit[num % 10] + unit[1][j] + p;
      num = Math.floor(num / 10);
    }
    s = p.replace(/(零.)*零$/, "").replace(/^$/, "零") + unit[0][i] + s;
  }

  return s
    .replace(/(零.)*零元/, "元")
    .replace(/(零.)+/g, "零")
    .replace(/^整$/, "零元整");
}

function getRelation(str1, str2) {
  if (str1 === str2) {
    console.warn("Two path are equal!"); // eslint-disable-line
  }
  const arr1 = str1.split("/");
  const arr2 = str2.split("/");
  if (arr2.every((item, index) => item === arr1[index])) {
    return 1;
  }
  if (arr1.every((item, index) => item === arr2[index])) {
    return 2;
  }
  return 3;
}

function getRenderArr(routes) {
  let renderArr = [];
  renderArr.push(routes[0]);
  for (let i = 1; i < routes.length; i += 1) {
    // 去重
    renderArr = renderArr.filter(item => getRelation(item, routes[i]) !== 1);
    // 是否包含
    const isAdd = renderArr.every(item => getRelation(item, routes[i]) === 3);
    if (isAdd) {
      renderArr.push(routes[i]);
    }
  }
  return renderArr;
}

/**
 * Get router routing configuration
 * { path:{name,...param}}=>Array<{name,path ...param}>
 * @param {string} path
 * @param {routerData} routerData
 */
export function getRoutes(path, routerData) {
  let routes = Object.keys(routerData).filter(
    routePath => routePath.indexOf(path) === 0 && routePath !== path
  );
  // Replace path to '' eg. path='user' /user/name => name
  routes = routes.map(item => item.replace(path, ""));
  // Get the route to be rendered to remove the deep rendering
  const renderArr = getRenderArr(routes);
  // Conversion and stitching parameters
  const renderRoutes = renderArr.map(item => {
    const exact = !routes.some(
      route => route !== item && getRelation(route, item) === 1
    );
    return {
      exact,
      ...routerData[`${path}${item}`],
      key: `${path}${item}`,
      path: `${path}${item}`
    };
  });
  return renderRoutes;
}

export function getPageQuery() {
  return parse(window.location.href.split("?")[1]);
}

export function getQueryPath(path = "", query = {}) {
  const search = stringify(query);
  if (search.length) {
    return `${path}?${search}`;
  }
  return path;
}

/* eslint no-useless-escape:0 */
const reg = /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;

export function isUrl(path) {
  return reg.test(path);
}

/* 设置url参数 */
export const setUrlParams = (p, history, reload) => {
  let str = "?";
  Object.keys(p).forEach(key => {
    if (key.trim()) str += `${key.trim()}=${`${p[key]}`.trim()}&`;
  });
  if (reload) {
    window.location.search = str;
  } else {
    history.replace(str);
  }
  return str;
};

export const getHashUrlParams = () => {
  const { hash = "" } = window.location;
  const search = hash.substr(hash.lastIndexOf("?"));
  const res = {};
  if (search) {
    const arr = search.replace(/^\?/, "").split("&");
    arr.forEach(item => {
      if (item) res[item.split("=")[0]] = item.split("=")[1] || "";
    });
  }
  return res;
};

export const getCurrentTenant = () => {
  const tenantStr = window.localStorage.getItem(TENANT_STORAGE_KEY) || "{}";
  try {
    return JSON.parse(tenantStr);
  } catch (_) {
    return {};
  }
};

export const getQueryVariable = param => {
  const reg1 = new RegExp(`(^|&)${param}=([^&]*)(&|$)`);
  const r =
    window.location.search.substr(1).match(reg1) ||
    window.location.hash
      .substring(window.location.hash.search(/\?/) + 1)
      .match(reg1);
  if (r !== null) {
    return decodeURIComponent(r[2]);
  }
  return "";
};
